package alg

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func init() {
	RegisterAlgInfo(
		"two-sum",
		AlgInfo{
			name: "两数之和",
			url:  "https://leetcode.cn/problems/two-sum",
			alg: func() {
				reader := bufio.NewReader(os.Stdin)

				fmt.Print("请输入数组(用逗号分隔，例如 2,7,11,15): ")
				input, _ := reader.ReadString('\n')
				input = strings.TrimSpace(input)

				nums := []int{}
				if input != "" {
					numStrs := strings.Split(input, ",")
					for _, numStr := range numStrs {
						num, err := strconv.Atoi(strings.TrimSpace(numStr))
						if err != nil {
							fmt.Printf("无效数字: %s\n", numStr)
							return
						}
						nums = append(nums, num)
					}
				}

				fmt.Print("请输入目标值: ")
				targetInput, _ := reader.ReadString('\n')
				target, err := strconv.Atoi(strings.TrimSpace(targetInput))
				if err != nil {
					fmt.Println("无效的目标值，请输入整数")
					return
				}

				res := twoSum(nums, target)

				fmt.Println(res)
			},
		})
}

// 思路：
// target - nums[i] 就是需要找到的另一个数，
// 使用一个 map 去存储这个 target - nums[i] 的值，当遍历 nums 时，每一次 target - numsp[i] 如果能在
// map 中找到，说明找到了需要的数字

// map 存储 数字 和 下标

func twoSum(nums []int, target int) []int {
	// 数字, 下标
	m := make(map[int]int)

	for index, value := range nums {
		num := target - value

		if res, ok := m[num]; ok {
			return []int{res, index}
		} else {
			m[value] = index
		}
	}

	return []int{}
}
